<?php

/**
 * DependenteService
 *
 * Acessa o Dao e o Repositorio do Dependente e disponibiliza a outras
 * classes metodos (Servicos) que precisam.
 *
 */
class DependenteService extends Model {

    /**
     * @var DependenteDao
     */
    private $dependenteDao;

    public function injectDependencies() {
        $this->dependenteDao = DependenteDao::getInstance();
    }

    /**
     * @method  updateDependent
     *
     * Atualiza um dependente do usuario no sistema
     *
     * @param Dependente $Dependent     Dependente com seus novos dados a ser atualizado
     * @param MyDb       $tMysqli       Manipulador de Banco de Dados do Sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  boolean
     * @since   2012-01-01
     */
    public function update($Dependent, &$tMysqli) {
        return $this->dependenteDao->update($Dependent, $tMysqli);
    }
    /**
     * @method  deleteDependent
     *
     * Deleta um dependente do usuario no sistema
     *
     * @param   int     $IDDependent    ID do Dependente cadastrado
     * @param   Db      $tMysqli        Manipulador de Banco de Dados do Sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  boolean
     * @since   2012-01-01
     */
    public function delete($IDDependent, &$tMysqli) {
        return $this->dependenteDao->delete($IDDependent, $tMysqli);
    }
    /**
     * @method  saveDependent
     *
     * Salva um dependente do usuario cadastrado no banco
     *
     * @param   Dependent   $Dependent
     * @param   Db        $tMysqli
     *
     * @return type
     */
    public function save($Dependent, &$tMysqli) {
        return $this->dependenteDao->save($Dependent, $tMysqli);
    }
    /**
     * @method  getDependentUpdateList
     *
     * Lista todos os Dependentes que foram Inseridos, Excluidos ou Deletados
     * na Lista dos DependentesAtuais
     *
     * @param   array   $ArNovosDependentes     Lista dos dependentes do usuario
     * @param   array   $ArDependentesAtuais    Lista dos dependentes cadastrados no momento do usuario
     *
     * @since   2011-12-16
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  array
     */
    public function getDependentUpdateList($ArNovosDependentes, $ArDependentesAtuais) {
        $ArDadosDependentes = array( 'Delete' => array(), 'Insert' => array() );
        $ArDadosDependentes['Insert'] = $this->getInsertedDependents($ArNovosDependentes, $ArDependentesAtuais);
        $ArDadosDependentes['Delete'] = $this->getDeletedDependents($ArNovosDependentes, $ArDependentesAtuais);
        $ArDadosDependentes['Update'] = $this->getUpdatedDependents($ArNovosDependentes, $ArDependentesAtuais);
        return $ArDadosDependentes;
    }
    /**
     * @method  getDeletedDependents
     *
     * Recupera uma lista de dependentes que foram excluidos
     *
     * @param   array   $ArNovosDependentes     Lista dos dependentes do usuario
     * @param   array   $ArDependentesAtuais    Lista dos dependentes cadastrados no momento do usuario
     *
     * @return  array
     * @since   2011-12-17
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    private function getDeletedDependents($ArNovosDependentes, $ArDependentesAtuais) {
        $ArDeletedDependent = array();
        if( !empty($ArDependentesAtuais) ) {
            foreach($ArDependentesAtuais as $tDependente) {
                if( !$this->isActiveDependent($tDependente->getIDDependente(), $ArNovosDependentes) ) {
                    $ArDeletedDependent[] = $tDependente->getIDDependente();
                }
            }
        }
        return $ArDeletedDependent;
    }
    /**
     *@method   getInsertedDependents
     *
     * Captura uma lista de Dependentes que foram inseridos no ultimo post
     *
     *
     * @param   array   $ArNovosDependentes     Lista dos dependentes do usuario
     * @param   array   $ArDependentesAtuais    Lista dos dependentes cadastrados no momento do usuario
     *
     * @since   2011-12-18
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  array
     */
    private function getInsertedDependents($ArNovosDependentes, $ArDependentesAtuais) {
        $ArInsertedDependent = array();
        if( !empty($ArDependentesAtuais) ) {
            foreach((array)$ArNovosDependentes as $IDDependente => $ArDependente) {
                if( $this->inInsertDepentent($IDDependente, $ArDependentesAtuais) ) {
                    $ArInsertedDependent[] = $ArDependente;
                }
            }
        } else {
            $ArInsertedDependent = $ArNovosDependentes;
        }
        return $ArInsertedDependent;
    }
    /**
     * @method  getUpdatedDependents
     *
     * Captura uma lista de dependentes que foram modificados no ultimo post
     *
     * @param   array   $ArNovosDependentes     Lista dos dependentes do usuario
     * @param   array   $ArDependentesAtuais    Lista dos dependentes cadastrados no momento do usuario
     *
     * @return  array
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   2011-12-22
     */
    public function getUpdatedDependents($ArNovosDependentes, $ArDependentesAtuais) {
        $ArUpdatedDependent = array();
        if( !empty($ArDependentesAtuais) ) {
            foreach($ArDependentesAtuais as $tDependente) {
                if( !empty($ArNovosDependentes[$tDependente->getIDDependente()]) ) {
                    if($ArNovosDependentes[$tDependente->getIDDependente()]['StNomeDependente'] != $tDependente->getStNome() ||
                        $ArNovosDependentes[$tDependente->getIDDependente()]['DtNascimentoDependente'] != $tDependente->getDtNascimento() ||
                        $ArNovosDependentes[$tDependente->getIDDependente()]['StGrauParentesco'] != $tDependente->getStGrauParentesco() ) {
                        $tDependente->setStNome($ArNovosDependentes[$tDependente->getIDDependente()]['StNomeDependente']);
                        $tDependente->setDtNascimento($ArNovosDependentes[$tDependente->getIDDependente()]['DtNascimentoDependente']);
                        $tDependente->setStGrauParentesco($ArNovosDependentes[$tDependente->getIDDependente()]['StGrauParentesco']);
                        $ArUpdatedDependent[] = $tDependente;
                    }
                }
            }
        }
        return $ArUpdatedDependent;
    }
    /**
     * @method  isActiveDependent
     *
     * Verifica se o dependente esta ativo atualmente no sistema.
     * Usa o $ArDependentesAtuais que e uma lista de objetos do tipo dependente e
     * e usado por getDeletedDependents
     *
     *
     * @param   int     $IDDependente           ID do dependente a ser comparado
     * @param   array   $ArDependentesAtuais    Lista dos dependentes atualmente
     * @return  boolean
     *
     * @since   2011-12-18
     */
    private function isActiveDependent($IDDependente, $ArDependentesAtuais) {
        if( !empty($ArDependentesAtuais) ) {
            foreach( $ArDependentesAtuais as $id => $ArDependente ) {
                 if( $id == $IDDependente ) {
                     return true;
                 }
            }
        }
        return false;
    }

    /**
     * @method  inInsertDependent
     *
     * Verifica se o dependente esta na lista dos dependentes inseridos atualmente.
     * Usa o $ArDependentesAtuais que e uma lista de arrays com dados dos dependentes e
     * e usado por getInsertedDependents
     *
     * @param   int     $IDDependente           ID do dependente a ser comparado
     * @param   array   $ArDependentesAtuais    Lista dos dependentes atualmente
     * @return  boolean
     * @since   2011-12-18
     */
    private function inInsertDepentent($IDDependente, $ArDependentesAtuais) {
        foreach( $ArDependentesAtuais as $tDependente) {
            if($tDependente->getIDDependente() == $IDDependente) {
                return false;
            }
        }
        return true;
    }


}

?>
